{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">原文：\n",
    "- https://blog.csdn.net/xuanwolanxue/article/details/62236413?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task\n",
    "\n",
    "> ```\n",
    "> 注：本篇笔记以gstreamer 1.8.1 版本为蓝本，若有出入的地方，请确认版本信息\n",
    "> ```\n",
    "\n",
    "# 1. log 调试信息的函数\n",
    "\n",
    "在 gstreamer 1.8.1 版本中定义了如下的 log 输出宏:\n",
    "\n",
    "## 1.1 最基本的 log 输出宏\n",
    "\n",
    "```c\n",
    "GST_CAT_LEVEL_LOG(cat,level,object,...)\n",
    "```\n",
    "\n",
    "其中\n",
    "\n",
    "*   cat：表示 category，用于区分 log 信息的类别，在后面说到 debug level 等信息的设置的时候会用到；\n",
    "*   level：表示当前输出的这条 log 信息属于哪一个等级，具体的等级定义，将在后文中介绍；\n",
    "*   obj：表示输出的 log 信息属于哪一个 GObject，注：此项可以设置为 NULL，表示不属于任何 GObject；\n",
    "*   … : 为 log 信息的内容。\n",
    "\n",
    "## 1.2 不同的 log 输出宏分组\n",
    "\n",
    "为了使用的方便，根据不同的输出需求，在基础输出宏的基础上再做了一次封装，同样是使用宏定义的方式。\n",
    "\n",
    "*   GST_CAT_ERROR_OBJECT(cat,obj,…)\n",
    "*   GST_CAT_WARNING_OBJECT(cat,obj,…)\n",
    "*   GST_CAT_INFO_OBJECT(cat,obj,…)\n",
    "*   GST_CAT_DEBUG_OBJECT(cat,obj,…)\n",
    "*   GST_CAT_LOG_OBJECT(cat,obj,…)\n",
    "*   GST_CAT_FIXME_OBJECT(cat,obj,…)\n",
    "*   GST_CAT_TRACE_OBJECT(cat,obj,…)\n",
    "\n",
    "这一组主要使用到了 category 和 GObject\n",
    "\n",
    "*   GST_CAT_ERROR(cat,…)\n",
    "*   GST_CAT_WARNING(cat,…)\n",
    "*   GST_CAT_INFO(cat,…)\n",
    "*   GST_CAT_DEBUG(cat,…)\n",
    "*   GST_CAT_LOG(cat,…)\n",
    "*   GST_CAT_FIXME(cat,…)\n",
    "*   GST_CAT_TRACE(cat,…)\n",
    "\n",
    "这一组只使用到了 category，而 obj 项将被设置为 NULL\n",
    "\n",
    "*   GST_ERROR_OBJECT(obj,…)\n",
    "*   GST_WARNING_OBJECT(obj,…)\n",
    "*   GST_INFO_OBJECT(obj,…)\n",
    "*   GST_DEBUG_OBJECT(obj,…)\n",
    "*   GST_LOG_OBJECT(obj,…)\n",
    "*   GST_FIXME_OBJECT(obj,…)\n",
    "*   GST_TRACE_OBJECT(obj,…)\n",
    "\n",
    "这一组只使用到了 obj， 而 category 项将被设置为 GST_CAT_DEFAULT，即默认类别\n",
    "\n",
    "*   GST_ERROR(…)\n",
    "*   GST_WARNING(…)\n",
    "*   GST_INFO(…)\n",
    "*   GST_DEBUG(…)\n",
    "*   GST_LOG(…)\n",
    "*   GST_FIXME(…)\n",
    "*   GST_TRACE(…)\n",
    "\n",
    "这一组最简洁，log 输出时，只需要输出内容，其中 category 为 GST_CAT_DEFAULT，obj 为 NULL。\n",
    "\n",
    "> 注： 官方建议不要在代码中轻易使用printf或g_print之类的函数，因为他们无法控制是否输出"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 日志等级\n",
    "\n",
    "在 gstreamer 1.8.1 版本中对 debug level 的定义如下（注：不同的版本中 debug level 的数量可能会有差别）：\n",
    "\n",
    "```c\n",
    "typedef enum {\n",
    "  GST_LEVEL_NONE = 0,\n",
    "  GST_LEVEL_ERROR = 1,\n",
    "  GST_LEVEL_WARNING = 2,\n",
    "  GST_LEVEL_FIXME = 3,\n",
    "  GST_LEVEL_INFO = 4,\n",
    "  GST_LEVEL_DEBUG = 5,\n",
    "  GST_LEVEL_LOG = 6,\n",
    "  GST_LEVEL_TRACE = 7,\n",
    "  /* add more */\n",
    "  GST_LEVEL_MEMDUMP = 9,\n",
    "  /* add more */\n",
    "  GST_LEVEL_COUNT\n",
    "} GstDebugLevel;\n",
    "```\n",
    "\n",
    "也就是说，gstreamer1.8.1 当中将 debug level 分为了 10 个等级：\n",
    "\n",
    "- 0：什么都不打印\n",
    "- 1：打印 error 的信息\n",
    "- 2，警告\n",
    "- 3：需要修复的\n",
    "- 4，信息(流程性的)\n",
    "- 5：调试信息\n",
    "- 6：所有message\n",
    "- 7：跟踪信息\n",
    "- 8：堆栈信息\n",
    "- …\n",
    "\n",
    "以此类推，其中等级是包含关系，比如设置level为4的话，1,2,3,4类型的信息都会打印。debug level **等级数字越大，输出的 log 信息就越多。**\n",
    "\n",
    "# 3. 使用命令行参数开启或设置 debug 信息\n",
    "\n",
    ">gst-launch-1.0 **--gst-debug-level=4** xxxxxxxxxxxx\n",
    "\n",
    "*   --gst-debug-level=LEVEL  \n",
    "    其中 LEVEL 的取值为 [0,9], 使用这种方式将同时开启 / 关闭所有模组的 debug 信息，可能会导致 debug 信息过多而影响关键信息的获取\n",
    "    \n",
    "*   --gst-debug=STRING  \n",
    "    其中 STRING 为字符串，使用这种方式只输出由 STRING 指定范围内的调试信息，格式为 ： category_name:LEVEL， 如果要设置多个类别时，每个类别设置之间使用 “,” 分开，例如：–gst-debug=\"videodecoder:5,fdsrc:4,oggdemux:3\"\n",
    "  \n",
    "* 更多选项\n",
    "\n",
    "```  \n",
    "GStreamer 选项\n",
    "  --gst-fatal-warnings              将所有的警告也当作严重问题\n",
    "  --gst-debug-help                  打印可用的调试类别并退出\n",
    "  --gst-debug-level=级别            默认调试级别，从 1(仅有错误)到 9(所有内容)，0代表无输出\n",
    "  --gst-debug=列表                  逗号分隔的“类别名称:级别”列表用来为每个类别设置指定的调试级别。如:GST_AUTOPLUG:5,GST_ELEMENT_*:3\n",
    "  --gst-debug-no-color              禁止彩色的调试信息输出\n",
    "  --gst-debug-color-mode            改变调试日志的颜色模式。可能的模式有：off、on、disable、auto和unix\n",
    "  --gst-debug-disable               禁止调试\n",
    "```   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 使用环境变量开启或设置 debug 信息\n",
    "\n",
    "\n",
    "gstreamer 中还可以使用环境变量开启或关闭 debug 信息，  \n",
    "此环境变量为：`GST_DEBUG`，  \n",
    "其使用方式和命令行参数 `–gst-debug` 一样，都是有一对对 category_name:LEVEL 这样的二元组构成，二元组与二元组之间使用 “，”（逗号）隔开。\n",
    "\n",
    "```sh\n",
    "export GST_DdEBUG=2,audiotestsrc:6\n",
    "```\n",
    "It will use Debug Level 6 for the audiotestsrc element, and 2 for all the others.\n",
    "\n",
    "> 注意: \n",
    ">     1. 二元组与二元组之间只能用逗号隔开，其不能有空格等其他符号; \n",
    ">     2. category_name支持\"*\"通配符, 如 \"GST_ELEMENT_*:4\"\n",
    "\n",
    "```sh\n",
    "GST_DEBUG=2,audio*:6\n",
    "```\n",
    "\n",
    "will use Debug Level 5 for all categories starting with the word audio. \n",
    "\n",
    "```sh\n",
    "GST_DEBUG=*:2  与 GST_DEBUG=2 等价\n",
    "```\n",
    "\n",
    "# 5. 在代码中动态设置 debug 等级\n",
    "\n",
    "在前面提到的两种开启或设置 debug 信息的方式都是在调用 `gst_init()` 函数期间完成的。也就是说它们有一个缺点，就是无法在运行过程中动态的调整 debug 信息的输出方式与等级，要实现这一个功能就需要通过调用一些函数接口的方式来动态调整 log 信息的输出等级。\n",
    "\n",
    "*   `gst_debug_set_default_threshold(level)`   \n",
    "控制全局（所有类别）的 log 等级\n",
    "    \n",
    "*   `gst_debug_set_threshold_for_name(name, level)`  \n",
    "控制某一个类别的 log 等级，如：xxx(“videodecoder”, 5)\n",
    "    \n",
    "*  ` gst_debug_set_threshold_from_string(list, reset)`  \n",
    "和 GST_DEBUG 类似，也是支持同时设置多个元组的 log 信息，后面一个 reset 参数： TRUE：清除之前的 log 输出设置信息，FALSE：将设置信息添加到现有的 log 信息设置当中"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "209.818px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
